package cn.zhfeat.hatch.web.controller.system;

import cn.zhfeat.core.base.BaseResultModel;
import cn.zhfeat.hatch.dto.sysuser.SysAuthorityDto;
import cn.zhfeat.hatch.dto.sysuser.SysUserDto;
import cn.zhfeat.hatch.web.service.ILoginService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;

/**
 * @author ZhangHao
 * @version 1.0.0.1
 * @description: 用户登录相关
 * 原：RequestMapping("/api/login") 变更为：@RequestMapping("/login")
 * @date 2018年5月17日 下午3:40:28
 */
@Controller
@RequestMapping("/login")
public class LoginController {

    @Autowired
    private ILoginService loginService;

    Logger log = LoggerFactory.getLogger(LoginController.class);

    /**
     * @param dto
     * @return
     * @description: 用户通过用户名密码登录
     * @author ZhangHao
     * @date 2018年5月17日 下午3:48:39
     * @version 1.0.0.1
     */
    @RequestMapping(value = "/ajaxLogin", method = RequestMethod.POST)
    @ResponseBody
    public BaseResultModel ajaxLogin(SysUserDto dto) {
        return loginService.ajaxLogin(dto);
    }

    /**
     * @param dto
     * @return
     * @description: 首次加载页面时，根据用户点击的一级菜单权限ID，从登陆用户角色对应的所有的权限中匹配其对应的二级菜单和三级菜单
     * @author ZhangHao
     * @date 2018年5月21日 上午12:47:56
     * @version 1.0.0.1
     */
    @RequestMapping(value = "/ajaxAuthsInfo", method = RequestMethod.POST)
    @ResponseBody
    public Object ajaxAuthsInfo(SysAuthorityDto dto) {
        return loginService.ajaxAuthsInfo(dto);
    }

    /**
     * @description: 退出登陆接口
     *
     * @return
     * @author ZhangHao
     * @date 2018年5月27日 下午5:56:40
     * @version 1.0.0.1
     */
    @RequestMapping(value = "/ajaxExitLogin")
    @ResponseBody
    public Object ajaxExitLogin() {
    	return loginService.ajaxExitLogin();
    }

    /**
     * @description: 从session中拿到所有的权限url，
     * 用于判断用户返回时当前页面是否是最后一页
     *
     * @return
     * @author ZhangHao
     * @date 2018年6月2日 上午9:57:45
     * @version 1.0.0.1
     */
    @RequestMapping(value = "/ajaxAuthsUrl")
    @ResponseBody
    public Object ajaxAuthsUrl() {
    	return loginService.ajaxAuthsUrl();
    }

    /**
     * @description: 从redis中判断当前session是否失效
     *
     * @param
     * @author ZhangHao
     * @date 2018/8/8 13:59
     * @version 1.0.0.1
     * @return java.lang.Object
     */

    @RequestMapping(value = "/ajaxGetShiroSession")
    @ResponseBody
    public Object ajaxGetShiroSession(){
        return loginService.ajaxGetShiroSession();
    }

    /**
     * @description: 判断token是否存在，是否过期接口，如果存在且未过期，根据token按规则生成ticket
     *
     * @param
     * @author ZhangHao
     * @date 2018/8/27 11:30
     * @version 1.0.0.1
     * @return java.lang.Object
     */

    @RequestMapping(value = "/validateToken")
    @ResponseBody
    public Object validateToken(HttpServletRequest request){
        log.debug("进入controller,获取exemptsToken:" + request.getParameter("exemptsToken"));
        return loginService.validateToken(request);
    }

    /**
     * @description: 根据用户名、密码、创建时间生成token，更新数据库(内部临时使用)
     *
     * @param
     * @author ZhangHao
     * @date 2018/8/27 11:42
     * @version 1.0.0.1
     * @return java.lang.Object
     */

    @RequestMapping(value = "/createToken")
    @ResponseBody
    public Object createToken(HttpServletRequest request){
        return loginService.createToken(request);
    }

    /**
     * @description:
     * 根据ticket全局票据，按规则解析成token，根据token从DB拿到用户名密码，
     * 根据用户名密码进行授权操作。更新token失效时间为当前时间。转发到登陆页面
     *
     * @param
     * @author ZhangHao
     * @date 2018/8/27 13:19
     * @version 1.0.0.1
     * @return org.springframework.web.servlet.ModelAndView
     */

    @RequestMapping("/main")
    public ModelAndView validateTicket(HttpServletRequest request){
        return loginService.validateTicket(request);
    }




}
